// models/product.js
const { DataTypes } = require("sequelize");
const sequelize = require("../config/database");

// 定义Product模型，对应数据库中的products表
const Product = sequelize.define(
  "Product", // 模型名称
  {
    // 主键字段
    id: {
      type: DataTypes.INTEGER,
      primaryKey: true,
      autoIncrement: true,
      comment: "商品唯一标识符，主键，自动递增",
    },
    // 商品名称字段
    name: {
      type: DataTypes.STRING(100),
      allowNull: false,
      validate: {
        len: [1, 100], // 名称长度限制
      },
      comment: "商品名称，最大长度100字符",
    },
    // 商品描述字段
    description: {
      type: DataTypes.TEXT, // 使用TEXT类型存储可能较长的描述
      allowNull: true,
      comment: "商品详细描述",
    },
    // 价格字段
    price: {
      type: DataTypes.DECIMAL(10, 2), // 10位数字，2位小数
      allowNull: false,
      validate: {
        min: 0, // 价格不能为负数
      },
      comment: "商品价格，精度为小数点后两位",
    },
    // 原价/市场价字段
    originalPrice: {
      type: DataTypes.DECIMAL(10, 2),
      allowNull: true,
      validate: {
        min: 0,
      },
      comment: "商品原价/市场价，用于显示折扣信息",
    },
    // 库存字段
    stock: {
      type: DataTypes.INTEGER,
      allowNull: false,
      defaultValue: 0,
      validate: {
        min: 0, // 库存不能为负数
      },
      comment: "商品库存数量",
    },
    // 商品图片字段
    image: {
      type: DataTypes.STRING(255),
      allowNull: true,
      comment: "商品主图片URL",
    },
    // 商品图集字段
    images: {
      type: DataTypes.JSON, // 使用JSON类型存储图片数组
      allowNull: true,
      comment: "商品图集，存储多张图片URL的JSON数组",
    },
    // 商品分类字段
    categoryId: {
      type: DataTypes.INTEGER,
      allowNull: false,
      comment: "商品分类ID，关联分类表",
    },
    // 商品状态字段
    status: {
      type: DataTypes.ENUM(
        "active",
        "inactive",
        "out_of_stock",
        "discontinued"
      ),
      defaultValue: "active",
      comment:
        "商品状态：active(上架)、inactive(下架)、out_of_stock(缺货)、discontinued(停产)",
    },
    // 销量字段
    salesCount: {
      type: DataTypes.INTEGER,
      defaultValue: 0,
      validate: {
        min: 0,
      },
      comment: "商品销售数量",
    },
    // 浏览量字段
    viewCount: {
      type: DataTypes.INTEGER,
      defaultValue: 0,
      validate: {
        min: 0,
      },
      comment: "商品浏览次数",
    },
    // 评分字段
    rating: {
      type: DataTypes.DECIMAL(3, 2), // 3位数字，2位小数，如4.85
      defaultValue: 0,
      validate: {
        min: 0,
        max: 5,
      },
      comment: "商品平均评分，范围0-5",
    },
    // 评分人数字段
    ratingCount: {
      type: DataTypes.INTEGER,
      defaultValue: 0,
      validate: {
        min: 0,
      },
      comment: "评分人数",
    },
    // 商品重量字段（用于运费计算）
    weight: {
      type: DataTypes.DECIMAL(8, 2),
      allowNull: true,
      validate: {
        min: 0,
      },
      comment: "商品重量(kg)，用于运费计算",
    },
    // 商品尺寸字段（用于运费计算）
    dimensions: {
      type: DataTypes.JSON,
      allowNull: true,
      comment: "商品尺寸{length, width, height}，单位厘米",
    },
    // SEO相关字段
    metaTitle: {
      type: DataTypes.STRING(100),
      allowNull: true,
      comment: "SEO标题",
    },
    metaDescription: {
      type: DataTypes.STRING(255),
      allowNull: true,
      comment: "SEO描述",
    },
    metaKeywords: {
      type: DataTypes.STRING(255),
      allowNull: true,
      comment: "SEO关键词",
    },
    // 创建时间和更新时间字段（显式定义以便添加备注和索引）
    createdAt: {
      type: DataTypes.DATE,
      allowNull: false,
      comment: "记录创建时间，由系统自动维护",
    },
    updatedAt: {
      type: DataTypes.DATE,
      allowNull: false,
      comment: "记录最后更新时间，由系统自动维护",
    },
  },
  {
    tableName: "products", // 数据库表名
    timestamps: true, // 自动管理createdAt和updatedAt字段
    comment: "商品表，存储所有商品信息",
    indexes: [
      // 商品名称索引
      {
        name: "K_name",
        fields: ["name"],
      },
      // 分类ID索引
      {
        name: "K_categoryId",
        fields: ["categoryId"],
      },
      // 价格索引
      {
        name: "K_price",
        fields: ["price"],
      },
      // 状态索引
      {
        name: "K_status",
        fields: ["status"],
      },
      // 销量索引
      {
        name: "K_salesCount",
        fields: ["salesCount"],
      },
      // 评分索引
      {
        name: "K_rating",
        fields: ["rating"],
      },
      // 创建时间索引
      {
        name: "K_createdAt",
        fields: ["createdAt"],
      },
      // 复合索引：分类和状态
      {
        name: "K_category_status",
        fields: ["categoryId", "status"],
      },
      // 复合索引：分类和价格
      {
        name: "K_category_price",
        fields: ["categoryId", "price"],
      },
    ],
  }
);

// 定义模型关联
Product.associate = function (models) {
  // 一个商品属于一个分类
  Product.belongsTo(models.Category, {
    foreignKey: "categoryId",
    as: "category",
  });

  // 一个商品可以有多个订单项
  Product.hasMany(models.OrderItem, {
    foreignKey: "productId",
    as: "orderItems",
  });

  // 一个商品可以有多个评论
  Product.hasMany(models.Review, {
    foreignKey: "productId",
    as: "reviews",
  });
};

module.exports = Product;
